<?php
//关于缩略图的相关的一些配置和算法
namespace Kuoqi\FileDriver\Algorithm;

/**
 * 缩略图的相关算法
 * Class Thumb
 * @package Kuoqi\FileDriver
 * User kuoqi
 * Datetime 2022/4/1 13:50
 * Remark
 */
class Thumb{

    /**
     * 跟随系统的默认方式
     * @var int
     * User kuoqi
     * Datetime 2022/4/1 13:46
     * Remark
     */
    static public $THUMB_MODE_NORMAL = 0;
    /**
     * 最小的一边铺满,并居中
     * @var int
     * User kuoqi
     * Datetime 2022/4/1 13:46
     * Remark
     */
    static public $THUMB_MODE_MINFILL = 1;
    /**
     * 使用高度铺满,宽度自动居中适应 flushThumbHeightfillWidthcentor
     * @var int
     * User kuoqi
     * Datetime 2022/4/1 14:24
     * Remark
     */
    static public $THUMB_MODEL_HFWC = 2;
    /**
     * 使用宽度铺满，高度自动适应居中 flushThumbWidthfillHeightcentor
     * @var int
     * User kuoqi
     * Datetime 2022/4/1 14:25
     * Remark
     */
    static public $THUMB_MODEL_WFHC = 3;

    static public function flushThumb($image){
        switch($image->getThumbMode()){
            case self::$THUMB_MODE_MINFILL:return self::flushThumbMinFILL($image);
            case self::$THUMB_MODEL_HFWC:return self::flushThumbHeightfillWidthcentor($image);
            case self::$THUMB_MODEL_WFHC:return self::flushThumbWidthfillHeightcentor($image);
            default:return self::flushThumbNormal($image);
        }
    }

    /**
     * 使用高度填满
     * @param $image
     * User kuoqi
     * Datetime 2022/4/1 14:27
     * Remark
     */
    static public function flushThumbHeightfillWidthcentor($image){
        $sw = $image->getWidth();
        $sh = $image->getHeight();
        $dw = $image->getThumbWIdth();
        $dh = $image->getThumbHeight();
        $hh = $sh / $dh;
        $nw = $dw * $hh;
        $nh = $sh;
        $x = ($sw - $nw) / 2;
        $y = 0;
        //bool imagecopyresized( resource $dst_image, resource $src_image, int $dst_x, int $dst_y, int $src_x, int $src_y, int $dst_w, int $dst_h, int $src_w, int $src_h)
        if(!@imagecopyresized($image->getImage(),$image->getSource()
            ,0,0
            ,$x ,$y
            ,$dw,$dh
            ,$nw,$nh
        )){
            $image->setError('创建缩略图失败->imagecopyresized error');
        }
    }

    /**
     * 使用宽度填充满
     * @param $image
     * User kuoqi
     * Datetime 2022/4/1 14:27
     * Remark
     */
    static public function flushThumbWidthfillHeightcentor($image){
        $sw = $image->getWidth();
        $sh = $image->getHeight();
        $dw = $image->getThumbWIdth();
        $dh = $image->getThumbHeight();

        $nw = $sw;//新的宽度
        $nh = $dh / $dw * $sw;//新的高度
        $x = 0;
        $y = ($sh - $nh ) / 2;//这个需要重新整理
        if(!@imagecopyresized($image->getImage(),$image->getSource()
            ,0,0
            ,$x ,$y
            ,$dw,$dh
            ,$nw,$nh
        )){
            $image->setError('创建缩略图失败->imagecopyresized error');
        }
    }

    /**
     * 最小的一边铺满,并居中
     * @param $image
     * User kuoqi
     * Datetime 2022/4/1 14:08
     * Remark
     */
    static public function flushThumbMinFILL($image){
        $sw = $image->getWidth();
        $sh = $image->getHeight();
        $dw = $image->getThumbWIdth();
        $dh = $image->getThumbHeight();
        if($sw / $sh > $dw / $dh){
            //原始宽高比过高
            self::flushThumbHeightfillWidthcentor($image);//使用高度填充满
        }else{
            //原始宽高比过小
            self::flushThumbWidthfillHeightcentor($image);//使用宽度填充满
        }
    }

    /**
     * 通用
     * @param $image
     * User kuoqi
     * Datetime 2022/4/1 14:08
     * Remark
     */
    static public function flushThumbNormal($image){
        //将 src_im 图像中坐标从 src_x，src_y  开始，宽度为 src_w，高度为 src_h 的一部分拷贝到 dst_im 图像中坐标为 dst_x 和 dst_y 的位置上。
        //imagecopy( resource $dst_im, resource $src_im, int $dst_x, int $dst_y, int $src_x, int $src_y, int $src_w, int $src_h)
        if(@!imagecopy(
            $image->getImage(),
            $image->getSource(),
            0,
            0,
            0,
            0,
            $image->getThumbWidth(),
            $image->getThumbHeight()
        )){
            $image->setError('创建缩略图失败->拷贝图片信息失败');
        }
    }

}